#ifndef BACKGROUND_TASK_H
#define BACKGROUND_TASK_H

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <mutex>
#include <list>
#include <condition_variable>
#include <atomic>

/**
 * @brief 后台任务处理类
 * 
 * 该类提供了一个在后台线程中执行任务的机制，可以安排任务在后台执行，
 * 并提供等待所有任务完成的功能。
 */
class BackgroundTask {
public:
    /**
     * @brief 构造函数
     * @param stack_size 后台任务线程的栈大小，默认为8192字节
     */
    BackgroundTask(uint32_t stack_size = 4096 * 2);
    
    /**
     * @brief 析构函数
     * 
     * 清理后台任务线程资源
     */
    ~BackgroundTask();

    /**
     * @brief 安排一个回调函数在后台线程中执行
     * @param callback 要执行的回调函数
     */
    void Schedule(std::function<void()> callback);
    
    /**
     * @brief 等待所有已安排的任务完成
     * 
     * 此方法会阻塞调用线程，直到所有任务执行完毕
     */
    void WaitForCompletion();

private:
    std::mutex mutex_;                              ///< 用于保护共享数据的互斥锁
    std::list<std::function<void()>> main_tasks_;   ///< 待执行任务队列
    std::condition_variable condition_variable_;    ///< 用于线程同步的条件变量
    TaskHandle_t background_task_handle_ = nullptr; ///< FreeRTOS任务句柄
    std::atomic<size_t> active_tasks_{0};           ///< 当前活跃的任务数量

    /**
     * @brief 后台任务线程的主循环
     * 
     * 此方法在后台线程中执行，不断从任务队列中取出任务并执行
     */
    void BackgroundTaskLoop();
};

#endif
